﻿using System;
using System.Collections.Generic;

namespace TDD_Args.Test
{
    public class Parser
    {
        private string args;
        private const char Delimiter = '-';

        public Parser(string args)
        {
            this.args = args;
        }

        public bool getBoolValue(string param)
        {
            //-l -p 8080 -d /usr/logs
            string paramValue = getParamStringValue(param);
            if(paramValue == null)
            {
                return false;
            }
            else
            {
                return paramValue.Length < 1 ? true : paramValue.ToLower().Equals("true") ? true : false;
            }

        }

        public int getNumberValue(string v)
        {
            string paramValue = getParamStringValue(v);
            if (string.IsNullOrEmpty(paramValue))
            {
                return 0;
            }
            {
                int result;
                if (!int.TryParse(paramValue, out result))
                {
                    throw new Exception($"参数不合法，期望的是数字，传入的是{paramValue}");
                }
                return result;
            }
        }

        public string getStringValue(string v)
        {
            string paramValue = getParamStringValue(v);
            if (string.IsNullOrEmpty(paramValue))
            {
                return "";
            }
            {
                return paramValue;
            }
        }

        public List<string> getListValue(string v)
        {
            string paramValue = getParamStringValue(v);
            if (string.IsNullOrEmpty(paramValue))
            {
                return new List<string>();
            }
            {
                return new List<string>(paramValue.Split(","));
            }
        }

        public string getParamStringValue(string param)
        {
            var index = args.IndexOf(param);
            if (index < 0)
            {
                return null;
            }
            var startIndex = index + 2;
            int nextIndex = getNextDelimiterIndex(startIndex);
            int substrLength = nextIndex - startIndex;
            var paramValue = args.Substring(startIndex, substrLength);
            return paramValue.Trim();
        }

        public int getNextDelimiterIndex(int baseIndex)
        {
            for (int i = 0; i < args.Length; i++)
            {
                if (args[i] == Delimiter && i > baseIndex)
                {
                    return i;
                }
            }
            return args.Length;
        }
    }
}